package com.spsoft.system.service.impl;

import com.spsoft.core.constants.CacheConstant;
import com.spsoft.core.utils.CollectionUtils;
import com.spsoft.core.utils.StringUtil;
import com.spsoft.system.entity.SysFunlist;
import com.spsoft.system.mapper.SysFunlistMapper;
import com.spsoft.system.model.bo.RoleAsMenuCodeBo;
import com.spsoft.system.service.SysFunlistService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.spsoft.vms.redis.RedisService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import javax.annotation.PostConstruct;
import java.util.*;

/**
 * <p>
 * 老系统菜单表 目前只用来判断权限使用， 不适用增删改
 * </p>
 *
 * @author dlchen
 * @since 2023-11-09
 */
@Slf4j
@Service
@RequiredArgsConstructor
public class SysFunlistServiceImpl extends ServiceImpl<SysFunlistMapper, SysFunlist> implements SysFunlistService {
    private final RedisService redisService;

    /**
     * 启动加载所有角色权限到缓存
     */
    @PostConstruct
    public void init() {
        log.info("************init  初始化【角色权限】到缓存开始*************");
        this.updateAllMenuAuthToCache();
        log.info("************init  初始化【角色权限】到缓存结束*************");
    }

    /**
     * 将所有菜单验证更新到缓存
     *
     * @return boolean
     */
    @Override
    public boolean updateAllMenuAuthToCache() {
        try {
            List<RoleAsMenuCodeBo> list = this.baseMapper.selectAllMenuIdByRoleId();
            if (!CollectionUtils.isAnyEmpty(list)) {
                Map<String, Set<String>> map = new HashMap<String, Set<String>>();
                list.forEach(r -> {
                    Set<String> codes = map.computeIfAbsent(r.getRoleId(), k -> new HashSet<>());
                    if(StringUtil.isNotBlank(r.getMenuCode())){
                        codes.add(r.getMenuCode());
                    }

                });
                map.forEach((k, v) -> {
                    redisService.setCacheSet(CacheConstant.SYS_CACHE_MENU_AUTH + k, v);
                });
                log.info("************  初始化【角色权限】到缓存成功,缓存数据：【{}】*************", map.size());

            }else {
                log.info("************  初始化【角色权限】到缓存,查询到数据：【{}】*************", 0);
            }
            return true;
        } catch (Exception e) {
            log.error("************  初始化【角色权限】到缓存异常{}*************", e.getMessage());
            return false;
        }
    }

}
